/**
  ******************************************************************************
  * @file    memory.h
  * @author  ashuai0110
  * @version V2.3
  * @date    2024-07-01
  * @brief   内存管理(参考rt-thread的mem,小内存管理算法<2MB)
  *
  ******************************************************************************
  * @attention
  *
  * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^
  * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git
  *
  ******************************************************************************
  */

#ifndef __MEMORY_H
#define __MEMORY_H

#ifdef __cplusplus
extern "C" {
#endif

/* 包含头文件-----------------------------------------------------------------*/
#include "common_include.h"

/**
 * @addtogroup modules
 * @{
 */

/**
 * @addtogroup memory
 * @{
 */

/* 宏定义---------------------------------------------------------------------*/
/**
 * @defgroup memory_global_macros memory global macros
 * @{
 */

#define MEM_SIZE                    (1024u)  /*!< 内存管理总字节数(28至2MB) 用户按需修改 */
#define MEM_ALIGN_SIZE              (4u)     /*!< 最小对齐字节数(默认4字节) */
#define MEM_CODE                    (0x1EA0u) /*!< 内存管理标识(默认0x1EA0) */
#define _MEM_STATES                 (1u)     /*!< 内存用量统计 0:关闭 1:开启 */

/**
 * @}
 */

/* 类型定义-------------------------------------------------------------------*/
/**
 * @defgroup memory_global_types memory global types
 * @{
 */

/** 
  * @brief  内存管理 structure definition
  */
typedef struct memory{
    uint16_t code;          /*!< 内存管理标识 */
    uint8_t used : 1;       /*!< 内存使用标志  0:未使用  1:已使用 */
    volatile uint32_t next; /*!< 下一个管理者的偏移(基于内存首地址) */
    volatile uint32_t prev; /*!< 上一个管理者的偏移(基于内存首地址) */
} mem_t;

/**
 * @}
 */

/* 全局变量-------------------------------------------------------------------*/

/* 函数原型-------------------------------------------------------------------*/
/**
 * @addtogroup memory_global_functions
 * @{
 */

void mem_init(void);

void *mem_alloc(uint32_t size);
void *mem_realloc(void *pStr, uint32_t size);

void mem_free(void *pStr);

void *mem_set(void *pStr, int c, uint32_t n);
void *mem_copy(void *pDest, const void *pSrc, uint32_t n);

#if _MEM_STATES
uint32_t mem_get_total_size(void);
uint32_t mem_get_used_size(void);
#endif

/**
 * @}
 */

/**
 * @}
 */

/**
 * @}
 */

#ifdef __cplusplus
}
#endif

#endif /* memory.h */
